
#ifndef BSPLINE_H_
#define BSPLINE_H_

#include "curva.h"
#include "bups.h"
#include <vector>

class Coord;

class Bspline : public Curva {
   protected:
      void validarIntegridad(const std::vector<Coord> &pcontrol) const;
      std::vector<Coord> pcontrol;

   private:
      BUPS bases;

   public:

      /*
       * Precondicion:
       *    La cantidad de elementos del vector de Coord debe cumplir
       *
       *    cant > grado()
       *    (cant - grado() - 1) % 2 == 0
       *
       * */       
      Bspline();

      /* Verifica si la cantidad de elementos cant satisface la precondicion
       * de la curva Bspline:
       *
       *    cant > grado()
       *    (cant - grado() - 1) % 2 == 0
       *
       * Retorna true si la precondicion es satisfecha, o false en caso contrario.
       * */
      static bool satisfacePrecond(size_t cant); 

      size_t grado() const;

      virtual ~Bspline();

      virtual Coord centro() const = 0;

      /*
       * Retorna una coordenada de la curva, en funcion del parametro i
       *
       * Precondicion:
       *    0 <= i < 1
       * */
      virtual Coord operator()(float i) const;

      /*
       * Retorna un vector tangente a de la curva, en funcion del parametro i
       *
       * Precondicion:
       *    0 <= i < 1
       * */
      virtual Coord tangente(float i) const;

      std::vector<Coord> getPuntosControl();

   private:
      void parametros(float i, float &t, int &enteroT) const;
};


#endif
